#ifndef COMMUNICATION_H
#define COMMUNICATION_H

#include "tcpsocket.h"
#include "codec.h"
#include "aescrypto.h"
#include <QObject>
#include <QRunnable>

class Communication : public QObject, public QRunnable
{
    Q_OBJECT
public:
    // 密钥的长度
    enum KeyLen { L16 = 16, L24 = 24, L32 = 32 };

    explicit Communication(Message& msg, QObject *parent = nullptr);
    ~Communication();

    // 生成对称加密AES的密钥
    QByteArray generateAesKey(KeyLen keylength);
    // 接收非对称加密（RSA）的公钥，进行对称密钥(AES)的分发
    void handleRsaFenFa(Message* msg);
    //


    // 给服务器发送数据
    void sendMessage(Message* msg, bool encrypt = true);
    // 解析数据 ------ 解析服务器发送过来的数据
    void parseRecvMessage();
    // 解析服务端发送过来的扑克牌的信息
    void parseCards(QByteArray data1, QByteArray data2);

    inline void stopLoop()
    {
        m_stop = true;
    }

protected:
    void run() override;


signals:
    /* 在Login::startConnect函数里面处理 */
    // 连接失败的信号
    void connectFailed();
    // 登录成功的信号
    void loginOk();
    // 注册成功的信号
    void registerOk();
    // 房间中的玩家人数的信号
    void playerCount(int number);
    // 通知GameModel网络版游戏开始
    void startGame(QByteArray msg);
    // 通知搜索房间的窗口
    void roomExist(bool);
    // 通知GameModel窗口有玩家离开房间，更新显示的房间中的人数
    void somebodyLeave(int count);
    // 错误信息
    void failedMsg(QByteArray msg);


private:
    bool m_stop = false;
    Message m_msgInfo;
    TcpSocket* m_socket = nullptr;
    // QSharedPointer<TcpSocket> m_socket = nullptr;
    QByteArray m_aesKey;
    AesCrypto* m_aes = nullptr;
};

#endif // COMMUNICATION_H
